package com._5704.website.util;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayDeque;
import java.util.List;
import java.util.Queue;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.util.regex.Pattern.compile;

/**
 * 对图片等文件的操作
 */
@Component
public class FileUtil {
    @Value("${download.filePath}")
    private  String path;

    /**
     * 删除文件夹,内部方法
     * @param folder 文件路径
     */
    private  void delete(File folder){
        File[] files = folder.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    //递归直到目录下没有文件
                    delete(file);
                } else {
                    //删除
                    file.delete();
                }
            }
        }
        //删除
        folder.delete();
    }

    /**
     *删除图片
     * @param picture 图片路径
     */
    @Async
    public void delete(String picture) {
        File folder = new File(path+picture);
        this.delete(folder);
    }

    /**
     * 上传图片到服务器方法
     * @param multipartFile 文件
     * @param name 名称
     */
    @Async
    public  void upload(MultipartFile multipartFile, String name){
        String filePath = this.path + name;

        try {
            File file = new File(filePath);
            // 文件父路径不存在，就创建
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            // 如果文件不存在，就直接转换
            if (!file.exists()){
                multipartFile.transferTo(file);
            }else{
                // 文件存在,使用流覆盖文件
                InputStream inputStream = multipartFile.getInputStream();
                FileOutputStream fileOutputStream = new FileOutputStream(file);
                int len;
                byte[] buffer = new byte[1024];
                while((len = inputStream.read(buffer)) > 0){
                    fileOutputStream.write(buffer,0,len);
                }
                fileOutputStream.flush();
                fileOutputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 上传文本到服务器
     * @param content 文本内容
     * @param name 名字
     */
    @Async
    public  void upload(String content, String name){
        String filePath = this.path + name;
        try {
            File file = new File(filePath);
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            byte[] buffer = content.getBytes(StandardCharsets.UTF_8);
            fileOutputStream.write(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 下载文件，不使用异步
     * @param name 文件名称
     * @return 文件内容
     */
    public  String download(String name){
        String filePath = this.path + name;
        String result = "";
        try {
            result =  Files.readString(Path.of(filePath));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 移动文件，使用异步
     * @param source 文件源路径
     * @param src 文件移动路径
     */
    @Async
    public  void move(String source,String src){
        File sourceFile = new File(this.path+source);
        File srcFile = new File(this.path+src);
        if (!srcFile.getParentFile().exists()){
            srcFile.getParentFile().mkdirs();
        }
        sourceFile.renameTo(srcFile);
    }



//    public  void delete(String picture) {
//        File file =new File(path +  picture);
//        if (file.exists()){
//            file.delete();
//        }
//    }

    /**
     * 删除一系列文件
     * @param list 文件list
     * @param parentPath 父路径
     */
    @Async
    public  void delete(List<String> list, String parentPath){
        list.forEach(e->{
            delete(parentPath + e);
        });
    }

    /**
     * 获得文件内容中图片路径
     * @param content
     * @param filePath
     * @return
     */
    public  Queue<String> getFromContent(String content, String filePath){
        // 图片路径正则
        Pattern pattern = compile(filePath+".*?.png");
        Matcher matcher = pattern.matcher(content);
        Queue<String> result =  new ArrayDeque<>();
        while (matcher.find()){
            result.add(matcher.group());
        }
        return result;
    }


}
